import random
'''
三门问题（Monty Hall problem）亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论，大致出自美国的电视游戏节目 Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔（Monty Hall）。

参赛者会看见三扇关闭了的门，其中一扇的后面有一辆汽车，选中后面有车的那扇门可赢得该汽车，另外两扇门后面则各藏有一只山羊。

当参赛者选定了一扇门，但未去开启它的时候，节目主持人开启剩下两扇门的其中一扇，露出其中一只山羊（主持人肯定会开一扇有羊的门）。主持人其后会问参赛者要不要换另一扇仍然关上的门。

#######
以下算法通过模拟三个门 doors (其实没必要那么精细建模)
进行了一些数组操作来模拟出中奖几率

'''
if __name__ == '__main__':
    n = 50000
    guess = -1
    right = -1
    unchanged_cnt = 0
    changed_cnt = 0
    for i in range(n):
        doors = [0, 0, 0]
        right = random.randint(0, 2)
        doors[right] = 1
        guess = random.randint(0, 2)
        change = random.randint(0, 1)
        select_open = random.randint(1, 2)
        if right == guess:
            select_open = (select_open + right) % 3
            doors[select_open] = -1
        else:
            select_open = [i for i in [0, 1, 2] if i not in [right, guess]][0]
            doors[select_open] = -1

        if change:
            guess = [i for i in doors if i != -1 and i != doors[guess]][0]  # 此时 guess 由 door 的角标变成了 door 中的数据
            if guess == doors[right]:
                changed_cnt += 1
        else:
            if guess == right:
                unchanged_cnt += 1

    print(f"改了之后赢的概率: {changed_cnt / n}")
    print(f"没有改赢的概率: {unchanged_cnt / n}")
    print(f"输的概率: {(n - unchanged_cnt - changed_cnt) / n}")
